/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cuadradogenetico;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.jgap.Chromosome;
import org.jgap.Configuration;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.InvalidConfigurationException;
import org.jgap.Population;
import org.jgap.impl.DefaultConfiguration;
import org.jgap.impl.IntegerGene;

/**
 *
 * @author Luis Roberto
 */
public class Algoritmo {
    final int N_GENES = 5; //Numero de genes contenidos en el cromosoma
    final int N_POBLACION = 10; //Numero de individuos en la poblacion
    
    private Configuration configuracion;
    private Adaptacion reglaAdaptacion;
    private Gene[] genes = new Gene[N_GENES];
    private Chromosome cromosoma;
    private Genotype genotipo;
    private int generacion;
    
    public Algoritmo(){
        generacion = 0;
        configuracion = new DefaultConfiguration(); //Creamos configuracion del AG
        reglaAdaptacion = new Adaptacion(); //Creamos una instancia de la clase Adaptacion

        try {
            configuracion.setFitnessFunction(reglaAdaptacion);
            for (int i = 0; i < N_GENES; i++) {
                genes[i] = new IntegerGene(configuracion, 0, 1); //Cada gen es un binario es decir valor entre 0 y 1
            }
            cromosoma = new Chromosome(configuracion, genes); //Creamos el cromosoma
            
            
            configuracion.setSampleChromosome(cromosoma); // Configuramos el ejemplo del cromosoma con el cual se trabajara
            configuracion.setPopulationSize(N_POBLACION); // Definimos el tamano inicial de la poblacion
      
            genotipo = Genotype.randomInitialGenotype(configuracion); //De manera aleatoria generamos individuos con caracteristicas randomicas
        } catch (InvalidConfigurationException ex) {
            JOptionPane.showMessageDialog(null, "Error en la configuracion del algortimo");
        }
    }
    
    public void evolucionar(){
        genotipo.evolve();
        generacion++;
    }
    
    public Population getPoblacion(){
        return genotipo.getPopulation();
    }
    
    public IChromosome getMejor(){
        return genotipo.getFittestChromosome();
    }
    
    public int getGeneracion(){
        return generacion;
    }
}